package cc.comac.mom.datahandlers.timer;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.dao.entity.EquipDevDao;
import cc.comac.mom.dao.entity.EquipSparePartEquipRelationDao;
import cc.comac.mom.dao.entity.EquipSparePartMasterDataDao;
import cc.comac.mom.dao.entity.EquipSparePartsDueDao;
import cc.comac.mom.entity.EquipDevEntity;
import cc.comac.mom.entity.EquipSparePartEquipRelationEntity;
import cc.comac.mom.entity.EquipSparePartMasterDataEntity;
import cc.comac.mom.entity.EquipSparePartsDueEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
import cc.comac.mom.util.TimeUtil;

/**
 * 备件到期定时任务
* @ClassName: EquipSparePartsDueScheduled  
* @Description: TODO  
* @author FYT  
* @date 2020年9月4日 上午9:40:11  
*
 */
@Component
public class EquipSparePartsDueScheduled extends ServiceImpl<EquipSparePartsDueDao, EquipSparePartsDueEntity>{
	@Autowired
	private EquipSparePartsDueDao equipSparePartsDueDao;

	@Autowired
	private EquipSparePartMasterDataDao equipSparePartMasterDataDao;

	@Autowired
	private EquipDevDao equipDevDao;

	@Autowired
	private EquipSparePartEquipRelationDao equipSparePartEquipRelationDao;
	
	
	@Scheduled(cron = "0 0 1 * * ?")//每天凌晨一点触发
	@Async
	@Transactional
	public void scheduled() {
		System.out.println(LocalDateTime.now()+"-----定时任务");
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("row_status", 1);
		List<EquipSparePartsDueEntity> selectByMap = equipSparePartsDueDao.selectByMap(map);
		if (selectByMap == null || selectByMap.size() < 1) {
			return;
		}
		ArrayList<EquipSparePartsDueEntity> listUpdateEntity = new ArrayList<EquipSparePartsDueEntity>();
		for (EquipSparePartsDueEntity item : selectByMap) {
			// 根据备件编码查询备件主数据
			HashMap<String, Object> mapSelectEquipSparePartMaster = new HashMap<String, Object>();
			mapSelectEquipSparePartMaster.put("row_status", 1);
			mapSelectEquipSparePartMaster.put("spare_part_number", item.getPartNumber());

			List<EquipSparePartMasterDataEntity> listEquipSparePartMasterData = equipSparePartMasterDataDao
					.selectByMap(mapSelectEquipSparePartMaster);
			if (listEquipSparePartMasterData == null || listEquipSparePartMasterData.size() < 1) {

				// 记录日志
				continue;
			}
			// 根据设备编号获取设备主数据信息
			HashMap<String, Object> mapEquipDev = new HashMap<String, Object>();
			mapEquipDev.put("row_status", 1);
			mapEquipDev.put("dev_number", item.getDevNumber());
			List<EquipDevEntity> listEquipDevEntity = equipDevDao.selectByMap(mapEquipDev);
			if (listEquipDevEntity == null || listEquipDevEntity.size() < 1) {
				// 记录日志
				continue;
			}
			// 根据设备主数据id和备件主数据Id获取设备关联信息
			HashMap<String, Object> map2 = new HashMap<String, Object>();
			map2.put("row_status", 1);
			map2.put("spare_part_id", listEquipSparePartMasterData.get(0).getId());
			map2.put("equip_dev_id", listEquipDevEntity.get(0).getId());
			List<EquipSparePartEquipRelationEntity> selectByMap4 = equipSparePartEquipRelationDao.selectByMap(map2);
			if (selectByMap4 == null || selectByMap4.size() < 1) {
				// 主数据绑定信息不存在
				if (item.getNextDate() != null) {
					// 主数据绑定信息不存在,下次更换日期不为空
					Duration duration = Duration.between(LocalDateTime.now(), item.getNextDate());
					long seconds = duration.getSeconds();
					long daysRemain = (seconds) / 86400;
					item.setDaysRemain(daysRemain);
					if (daysRemain < 0) {
						// 主数据绑定信息不存在，下次更换日期不为空,如果剩余日期小于0，则删除该条数据
						item.setLastModifiedTime(TimeUtil.getLocalDateTime());
						item.setLastModifiedTimeZone(TimeUtil.getLocalTimeZone());
						item.setRowStatus(0);
//						baseEntityDataUtil.deleteBaseEntityData(item);
					//	equipSparePartsDueDao.updateById(item);
						listUpdateEntity.add(item);
					} else {
						// 主数据绑定信息不存在，下次更换日期不为空，如果剩余日期大于0，则修改该条数据
//						baseEntityDataUtil.updateBaseEntityData(item);
						item.setLastModifiedTime(TimeUtil.getLocalDateTime());
						item.setLastModifiedTimeZone(TimeUtil.getLocalTimeZone());
					//	equipSparePartsDueDao.updateById(item);
						listUpdateEntity.add(item);
					}

				}
			} else {
				// 主数据绑定信息存在,如果使用周期存在，则用该周期计算新的下次更新日期和剩余天数
				if (selectByMap4.get(0).getLifeCycle() > 0) {
					LocalDateTime nextDate = item.getReplacementTime().plusDays(selectByMap4.get(0).getLifeCycle());
					Duration duration = Duration.between(LocalDateTime.now(), nextDate);
					long seconds = duration.getSeconds();
					long daysRemain = (seconds) / 86400;
					item.setDaysRemain(daysRemain);
					item.setNextDate(nextDate);
//					baseEntityDataUtil.updateBaseEntityData(item);
					item.setLastModifiedTime(TimeUtil.getLocalDateTime());
					item.setLastModifiedTimeZone(TimeUtil.getLocalTimeZone());
					//equipSparePartsDueDao.updateById(item);
					listUpdateEntity.add(item);
					continue;
				} else {
					if(item.getNextDate() != null) {
						Duration duration = Duration.between(LocalDateTime.now(), item.getNextDate());
						long seconds = duration.getSeconds();
						long daysRemain = (seconds) / 86400;
						item.setDaysRemain(daysRemain);
						item.setLastModifiedTime(TimeUtil.getLocalDateTime());
						item.setLastModifiedTimeZone(TimeUtil.getLocalTimeZone());
//						baseEntityDataUtil.updateBaseEntityData(item);
						//equipSparePartsDueDao.updateById(item);
						listUpdateEntity.add(item);
					}
				}
			}
			// 记录日志
			continue;
		}
		//批量修改
		if(listUpdateEntity != null && listUpdateEntity.size()>0) {
			this.updateBatchById(listUpdateEntity);
		}

	}
}
